<?php
/**
 * 代码聚合工具 v1.0
 * 支持递归读取目录，合并指定类型代码文件到TXT
 * 运行环境：PHP 7.4+
 */

// 配置参数
$sourceDir =  __DIR__ . '/flow_predictor';    // 源代码目录
$outputDir = __DIR__ . '/flow_predictor';    // 输出目录
$extensions = ['php', 'js', 'html', 'py', 'css']; // 需要聚合的文件扩展名
$excludeDirs = ['.git', 'node_modules', 'vendor', '__pycache__']; // 排除的目录
$excludeFiles = ['.gitignore', '.env', 'composer.lock', 'package-lock.json']; // 排除的文件

// 创建输出目录（如果不存在）
if (!is_dir($outputDir)) {
    if (!mkdir($outputDir, 0755, true)) {
        die("无法创建输出目录: {$outputDir}\n");
    }
}

// 生成唯一输出文件名
$outputFile = $outputDir . DIRECTORY_SEPARATOR .'code.txt';

// 初始化结果数组和统计信息
$aggregatedContent = [];
$fileCount = 0;
$processedFiles = [];

// 递归遍历目录
function traverseDirectory($dir, &$result, $extensions, $excludeDirs, $excludeFiles, &$fileCount, &$processedFiles) {
    if (!is_dir($dir)) {
        return;
    }

    $items = scandir($dir);
    if ($items === false) {
        return;
    }

    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }

        $path = $dir . DIRECTORY_SEPARATOR . $item;

        if (is_dir($path)) {
            // 检查是否为排除的目录
            if (!in_array($item, $excludeDirs)) {
                traverseDirectory($path, $result, $extensions, $excludeDirs, $excludeFiles, $fileCount, $processedFiles);
            }
        } elseif (is_file($path)) {
            // 检查是否为排除的文件
            if (in_array($item, $excludeFiles)) {
                continue;
            }
            
            $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
            if (in_array($ext, $extensions)) {
                $content = readFileContent($path);
                if ($content !== false) {
                    $relativePath = str_replace(dirname(__DIR__), '', $path);
                    $result[] = $content . "\n\n";
                    $fileCount++;
                    $processedFiles[] = $relativePath;
                }
            }
        }
    }
}

// 读取文件内容并处理异常
function readFileContent($filePath) {
    $content = @file_get_contents($filePath);
    if ($content === false) {
        error_log("无法读取文件: {$filePath}");
        return false;
    }

    // 处理编码问题，确保UTF-8编码
    if (!mb_check_encoding($content, 'UTF-8')) {
        $content = mb_convert_encoding($content, 'UTF-8', 'auto');
    }

    return $content;
}

// 执行遍历
echo "开始扫描目录: {$sourceDir}\n";
traverseDirectory($sourceDir, $aggregatedContent, $extensions, $excludeDirs, $excludeFiles, $fileCount, $processedFiles);

// 写入聚合文件
$totalSize = 0;
if (!empty($aggregatedContent)) {
    $totalSize = file_put_contents($outputFile, implode('', $aggregatedContent));
}

// 输出结果
echo "\n聚合完成！\n";
echo "源代码目录: {$sourceDir}\n";
echo "共处理文件: {$fileCount} 个\n";
echo "支持类型: " . implode(', ', $extensions) . "\n";
echo "总输出大小: " . formatBytes($totalSize) . "\n";
echo "输出文件: {$outputFile}\n";
echo "\n文件已准备好用于软著申请！\n";

// 格式化文件大小函数
function formatBytes($bytes, $precision = 2) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB'];
    $bytes = max($bytes, 0);
    if ($bytes === 0) return '0 B';
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
    $pow = min($pow, count($units) - 1);
    return number_format($bytes / (1024 ** $pow), $precision) . ' ' . $units[$pow];
}